<template>
    <view class="u-form"><slot /></view>
</template>

<script>
    /**
     * form 表单
     * @description 此组件一般用于表单场景，可以配置Input输入框，Select弹出框，进行表单验证等。
     * @tutorial http://uviewui.com/components/form.html
     * @property {Object} model 表单数据对象
     * @property {Boolean} border-bottom 是否显示表单域的下划线边框
     * @property {String} label-position 表单域提示文字的位置，left-左侧，top-上方
     * @property {String Number} label-width 提示文字的宽度，单位rpx（默认90）
     * @property {Object} label-style lable的样式，对象形式
     * @property {String} label-align lable的对齐方式
     * @property {Object} rules 通过ref设置，见官网说明
     * @property {Array} error-type 错误的提示方式，数组形式，见上方说明(默认['message'])
     * @example <u-form :model="form" ref="uForm"></u-form>
     */

export default {
    name: 'u-form',
    props: {
        // 当前form的需要验证字段的集合
        model: {
            type: Object,
            default() {
                return {};
            }
        },
        // 验证规则
        // rules: {
        //     type: [Object, Function, Array],
        //     default() {
        //         return {};
        //     }
        // },
        // 有错误时的提示方式，message-提示信息，border-如果input设置了边框，变成呈红色，
        // border-bottom-下边框呈现红色，none-无提示
        errorType: {
            type: Array,
            default() {
                return ['message', 'toast']
            }
        },
        // 是否显示表单域的下划线边框
        borderBottom: {
            type: Boolean,
            default: true
        },
        // label的位置，left-左边，top-上边
        labelPosition: {
            type: String,
            default: 'left'
        },
        // label的宽度，单位rpx
        labelWidth: {
            type: [String, Number],
            default: 90
        },
        // lable字体的对齐方式
        labelAlign: {
            type: String,
            default: 'left'
        },
        // lable的样式，对象形式
        labelStyle: {
            type: Object,
            default() {
                return {}
            }
        },
    },
    provide() {
        return {
            uForm: this
        };
    },
    data() {
        return {
            rules: {}
        };
    },
    created() {
        // 存储当前form下的所有u-form-item的实例
        // 不能定义在data中，否则微信小程序会造成循环引用而报错
        this.fields = [];
    },
    methods: {
        setRules(rules) {
            this.rules = rules;
        },
        // 清空所有u-form-item组件的内容，本质上是调用了u-form-item组件中的resetField()方法
        resetFields() {
            this.fields.map(field => {
                field.resetField();
            });
        },
        // 校验全部数据
        validate(callback) {
            return new Promise(resolve => {
                // 对所有的u-form-item进行校验
                let valid = true; // 默认通过
                let count = 0; // 用于标记是否检查完毕
                let errorArr = []; // 存放错误信息
                this.fields.map(field => {
                    // 调用每一个u-form-item实例的validation的校验方法
                    field.validation('', error => {
                        // 如果任意一个u-form-item校验不通过，就意味着整个表单不通过
                        if (error) {
                            valid = false;
                            errorArr.push(error);
                        }
                        // 当历遍了所有的u-form-item时，调用promise的then方法
                        if (++count === this.fields.length) {
                            resolve(valid); // 进入promise的then方法
                            // 判断是否设置了toast的提示方式，只提示最前面的表单域的第一个错误信息
                            if(this.errorType.indexOf('none') === -1 && this.errorType.indexOf('toast') >= 0 && errorArr.length) {
                                this.$u.toast(errorArr[0]);
                            }
                            // 调用回调方法
                            if (typeof callback == 'function') callback(valid);
                        }
                    });
                });
            });
        }
    }
};
</script>

<style scoped lang="scss">
@import "../../libs/css/style.components.scss";
</style>
